package cn.xxi.ai.application.dto;

import cn.xxi.ai.application.util.ChatSinksHolder;
import dev.langchain4j.data.message.ChatMessage;
import lombok.Getter;
import lombok.Setter;
import reactor.core.publisher.Sinks;

import java.io.Serial;
import java.io.Serializable;

/**
 * 聊天上下文对象，封装一次对话中的关键信息，包括：
 * - conversationId：对话 ID
 * - parentId：上级消息 ID（可为 null）
 * - sinksId：Sinks 实例的唯一标识
 *
 * 提供获取当前上下文对应 Sinks 的快捷方法。
 * 
 * 用于 SSE 实时推送等场景。
 * 
 * @author bingo
 */
@Setter
@Getter
public class ChatContext implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    private Long conversationId;
    private Long parentId;
    private Long sinksId;

    public ChatContext(Long conversationId, Long parentId, Long sinksId) {
        this.conversationId = conversationId;
        this.parentId = parentId;
        this.sinksId = sinksId;
    }

    /**
     * 获取该上下文对应的 Sinks 实例（消息推送通道）
     * 
     * @return Sinks.Many<SseChatMessage>
     */
    public Sinks.Many<SseChatMessage> sinks() {
        return ChatSinksHolder.getOrCreate(sinksId);
    }
}
